package com.shujia.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo10Group {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()

    conf.setAppName("group")

    conf.setMaster("local")

    val sc = new SparkContext(conf)

    //统计学生的总分

    val linesRDD: RDD[String] = sc.textFile("data/score.txt")

    //取出学号和分数
    val scoreRDD: RDD[(String, Int)] = linesRDD
      .map(line => line.split(","))
      .filter(arr => arr.length == 3)
      .map {
        case Array(id: String, _: String, sco: String) =>
          (id, sco.toInt)
      }

    /**
      * groupBy: 指定一个分组的字段进行分组，  不需要一定是一个kv格式
      * 返回的新的rdd的value里面保护所有的字段
      *
      */

    val groupByRDD: RDD[(String, Iterable[(String, Int)])] = scoreRDD.groupBy(kv => kv._1)


    groupByRDD
      .map {
        case (id: String, iter: Iterable[(String, Int)]) =>
          val sumSco: Int = iter.map(_._2).sum
          (id, sumSco)
      }
      .foreach(println)

    /**
      * groupByKey: rdd必须是一个kv格式
      * 返回的新的rdd的迭代器中的数据只包含value, 后续在处理数据的时候方便一点
      *
      * groupByKey: 可以减少shuffle过程中传输的数据量，效率比groupBy高
      *
      */

    val groupByKeyRDD: RDD[(String, Iterable[Int])] = scoreRDD.groupByKey()

    groupByKeyRDD
      .map {
        case (id: String, iter: Iterable[Int]) =>
          (id, iter.sum)
      }
      .foreach(println)

    while (true) {

    }
  }

}
